import 'package:dio/dio.dart';
import 'package:flutter_enjoy_plus/constants/index.dart';
import 'package:flutter_enjoy_plus/utils/Toast.dart';

class RequestDio {
  final Dio _dio = Dio();
  RequestDio() {
    _dio
      ..options.baseUrl = GlobalVariable.BASE_URL
      ..options.connectTimeout =
          const Duration(seconds: GlobalVariable.NET_WORK_TIME)
      ..options.receiveTimeout =
          const Duration(seconds: GlobalVariable.NET_WORK_TIME);
    __registerInterceptors();
  }

  // 拦截器
  __registerInterceptors() {
    _dio.interceptors.add(
      InterceptorsWrapper(
        // 请求拦截器
        onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
          // 如果你想完成请求并返回一些自定义数据，你可以使用 `handler.resolve(response)`。
          // 如果你想终止请求并触发一个错误，你可以使用 `handler.reject(error)`。
          return handler.next(options);
        },
        // 响应拦截器
        onResponse: (Response response, ResponseInterceptorHandler handler) {
          // 如果你想终止请求并触发一个错误，你可以使用 `handler.reject(error)`。
          // 成功
          if (response.statusCode! >= 200 && response.statusCode! < 300) {
            return handler.next(response);
          } else {
            PromptAction.showErrorToast(response.statusMessage!);
            return handler.reject(
              DioException(
                requestOptions: response.requestOptions,
              ),
            );
          }
        },
        //  错误拦截器
        onError: (DioException error, ErrorInterceptorHandler handler) {
          // 如果你想完成请求并返回一些自定义数据，你可以使用 `handler.resolve(response)`。
          return handler.next(error);
        },
      ),
    );
  }

  // get请求
  Future get(String url, {Map<String, dynamic>? params}) async {
    final res = await _dio.get(url, queryParameters: params);
    return _handleRequest(res);
  }

  // post请求
  Future post(String url, {Map<String, dynamic>? data}) async {
    final res = await _dio.post(url, data: data);
    return _handleRequest(res);
  }

  // put请求
  Future put(String url, {Map<String, dynamic>? data}) async {
    final res = await _dio.put(url, data: data);
    return _handleRequest(res);
  }

  // delete请求
  Future delete(String url, {Map<String, dynamic>? data}) async {
    final res = await _dio.delete(url, data: data);
    return _handleRequest(res);
  }

  // 对结果的处理函数
  _handleRequest(Response result) {
    if (result.data['code'] == 10000) {
      return result.data['data'];
    }
    // 抛出异常
    throw Exception(result.data['message']);
  }
}

RequestDio requestDio = RequestDio();
